<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*
           为什么要进行垃圾回收 
         */
        let person = { 
            name: 'xiaomi',
            age: 12
        }
        console.log(person) // {name: xiaomi, age:12}
        person = [12,13]  // 此时指向的新赋值的数组，之前开辟的空间就会成为垃圾，这就是为什么要有垃圾回收机制
        console.log(person)

        /* 
            垃圾回收机制
            将不可达的内存释放掉(可达就是可以访问到)
            垃圾回收会定时找出不可达对象并并释放
         */
        let person2 = { 
            name: 'redmi'
        }
        person2 = null // 此时的name不可达了就会被清理

        // 找出不可达对象有两种策略 1、标记清除法 2、引用计数法
        // 标记清除法分为标记和清除两个阶段，标记阶段需要从根节点遍历内存中的所有对象，并为可达的对象做上标记，清除阶段则把没有标记的对象（非可达对象）销毁。
        

        // 引用计数法
        /*  
            引用计数法主要记录对象有没有被其他对象引用，如果没有被引用，它将被垃圾回收机制回收。
            它的策略是跟踪记录每个变量值被使用的次数，当变量值引用次数为0时，垃圾回收机制就会把它清理掉。
         */
        let phone = {name: 'xiaomi'}  // {name: 'xiaomi'}引用次数为1
        let phone1 = phone  // {name: 'xiaomi'} 引用次数为2
        phone = null // {name: 'xiaomi'} 应用次数为1
        phone1 = phone // {name: 'xiaomi'} 引用次数为0，被清理了
    </script>
</body>
</html>